home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.whtech.com
/
ftp.whtech.com.tar
/
ftp.whtech.com
/
datasheets and manuals
/
Hardware
/
WHT
/
scsi
/
dsr_sources_2_2001
/
open
< prev
next >
Wrap
Text File
|
2006-10-19
|
4KB
|
165 lines
* I/O Op Code 0 - OPEN
*
* This module will check the attributes of the file to open,
* make sure everything's OK and open the file. A maximum of
* 16 files can be open at one time. If a user attempts to
* open a 17th file, an error is returned
*
* Date: April 21, 1995 (One week before Lima!)
*
* Author: David Nieters
*
* We will begin by making sure the file isn't open already
OPEN0
ANDI R12,>FF00
AI R12,24
LDCR @B02,4 Select RAM bank 2
BLWP @IFO
JNE OPEN1
BL @DSRERR File is already open / Error!
DATA >0200 Bad open attribute
* Make sure that there are not too many files open already
OPEN1
LDCR @B02,4 Select RAM bank 2
LI R1,OFCASH
OPEN1A C @4(R1),@ZERO
JEQ OPEN2
AI R1,100
CI R1,>6000
JL OPEN1A
BL @DSRERR There are too many files open!
DATA >0400 Out of space error
* If the file is being opened in relative mode, assume
* the record format is fixed.
OPEN2 LDCR @ZERO,4
MOVB @PABBUF+1,R1
ANDI R1,>0100
JEQ OPEN3
MOVB @PABBUF+1,R1
ANDI R1,>EFFF
MOVB R1,@PABBUF+1
* See how the file is to be opened and branch to the
* right piece of code.
OPEN3
MOV @PABBUF,R1
ANDI R1,>0006 Mask out the mode of operation
MOV @OPENJT(R1),R2 Get address of open routine
B *R2
* This jump table gives the entry point for each of the 4
* modes a file can be open
OPENJT DATA OPENUP Update mode
DATA OPENOU Output mode
DATA OPENIN Input mode
DATA OPENAP Append Mode
* Here are some subroutines used by OPEN
*
**
*
* OSCASH - OPEN SETUP CACHE
*
* This procedure allocates a cache entry and fills in
* the following fields -
*
* SCSI ID, Name Length, FDR bank, Buffer Bank, FDR Address,
* Buffer Address, Full file name, AU of FDR, File Open Attributes
*
* It resets all other fields to zero.
*
**
OSCASH
LDCR @B02,4 Select RAM bank 2
LI R4,OFCASH
LI R3,>5000 FDR pointer
OSC1 C @4(R4),@ZERO Is this cache entry used?
JEQ OSC2 If not, we will use it
AI R3,>100 Otherwise, check next one
AI R4,100
JMP OSC1
OSC2
* Now fill in the cache entry
*
MOVB R6,*R4 SCSI ID
MOVB @B05,@2(R4) FDR bank
MOV R3,@4(R4) FDR address
MOV R3,R1 Compute bank of buffer (6 or 7)
ANDI R1,>0800
SRL R1,3
AI R1,>0600
MOVB R1,@3(R4) Buffer Bank
ANDI R3,>0700 Compute buffer address
SLA R3,1
AI R3,>5000
MOV R3,@6(R4) Buffer address
* Now move the file name to the cache entry. While we are
* moving it, we will compute the file name's length. While
* the length isn't used now, in a future version of the
* DSR, it can use the length to quickly search through the
* cache entries to find the right match
CLR R1 R1 will compute file name length
AI R4,8
LI R3,NCB
LI R0,40
OSC3 CB @SPACE,*R3
JEQ OSC4
INC R1 Increment file name length
OSC4 MOVB *R3+,*R4+
DEC R0
JNE OSC3
SWPB R1 Now put in the file name length
MOVB R1,@-47(R4)
LDCR @B04,4 Select RAM bank 4
MOV @SAVEAU,R0 Get AU of the FDR
LDCR @B02,4 Select RAM bank 2
MOV R0,*R4+ Store the FDR's AU
CLR *R4+ Current AU (none)
CLR *R4+ Sector within AU
CLR *R4+ Pointer within buffer
* Get the file open attribute from the PAB
LDCR @ZERO,4
MOVB @PABBUF+1,R1
ANDI R1,>0600
SRL R1,1
LDCR @B02,4
MOVB R1,*R4+
* Now see if it is sequential or relative
LDCR @ZERO,4
MOVB @PABBUF+1,R1
ANDI R1,>0100
LDCR @B02,4
MOVB R1,*R4+
CLR *R4+ Buffer size
CLR *R4+ Buffer Modified
CLR *R4+ Sector or Record #
AI R4,-64 Reset pointer
RT
PAGE